package org.example.Server.service.unit.impl;

import org.example.Server.mapper.unit.UnitMapper;
import org.example.Server.model.resource.Resource;
import org.example.Server.model.unit.*;
import org.example.Server.service.unit.UnitService;
import org.example.Server.utils.ResultAPI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class UnitServiceImpl implements UnitService {
    @Autowired
    UnitMapper unitMapper;

    /**
     * 获取课程章节列表
     *
     * @param semId
     * @return
     */
    @Override
    public ResultAPI getUnits(Integer semId) {
        List<UnitVO> unitVOS = unitMapper.getUnitsBySemId(semId);
        return ResultAPI.success(unitVOS);
    }

    /**
     * 获取课程单元下的资源
     *
     * @param unitId
     * @return
     */
    @Override
    public ResultAPI getUnitResource(Integer unitId) {
        List<UnitRe> resourceList = unitMapper.getUnitReById(unitId);
        return ResultAPI.success(resourceList);
    }

    /**
     * 学生观看资源
     *
     * @param stuUnitRe
     * @return
     */
    @Transactional
    @Override
    public ResultAPI addStuUnitRe(StuUnitRe stuUnitRe) {
        Integer id = unitMapper.getStuUnitReExist(stuUnitRe);
        if (id != null && id > 0) {
            return ResultAPI.success("已观看");
        }
        // 加入学生单元资源记录
        unitMapper.addStuUnitRe(stuUnitRe);
        // 根据unit_id更新学生小节已看资源数
        StuUnit stuUnit = unitMapper.getStuUnit(stuUnitRe);
        if (stuUnit == null) {
            unitMapper.addStuUnit(stuUnitRe);
        } else {
            unitMapper.updateStuUnit(stuUnit);
        }
        return ResultAPI.success();
    }

    /**
     * 学生的小节完成度以及
     *
     * @param semId
     * @param userId
     * @return
     */
    @Override
    public ResultAPI getStuUnits(Integer semId, Integer userId) {
        // 获取小节和单元列表
        List<StuUnitVO> stuUnitVOS = unitMapper.getStuUnits(semId, userId);
        // 组装
        List<StuUnitVO> pUnitVOS = stuUnitVOS.stream()
                .filter(item -> item.getUnit_module() == -1)
                .toList();
        for (StuUnitVO stuUnitVO : pUnitVOS) {
            Integer unitId = stuUnitVO.getUnit_id();
            List<StuUnitVO> children = stuUnitVOS
                    .stream()
                    .filter(it -> Objects.equals(it.getUnit_module(), unitId))
                    .toList();
            if (!children.isEmpty()) {
                stuUnitVO.setChildren(children);
            }
        }
        return ResultAPI.success(pUnitVOS);
    }

    /**
     * 获取学生端小节资源
     *
     * @param unitId
     * @param userId
     * @return
     */
    @Override
    public ResultAPI getStuUnitRes(Integer unitId, Integer userId) {
        List<StuUnitReVO> stuUnitReVOS = unitMapper.getStuUnitRes(unitId, userId);
        return ResultAPI.success(stuUnitReVOS);
    }
}
